package aplicacao;

import classesBD.*;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author Pessoal
 */
public class SaxParser extends DefaultHandler {
  private String tagPrincipal;
  private String tagSecundaria;
  private tabela tab;
  private boolean autorValido = false;
  
  private final Collection<String> IGNORETAGS = new ArrayList(Arrays.asList("i","sub","sup","tt"));
  private String texto;
  private boolean addTexto;
  HashMap<String, Integer> temp = new HashMap<String, Integer>();
  
  public SaxParser() {
    tagPrincipal = "";
    tagSecundaria = "";
    texto = "";
    addTexto = false;
  }
 
  public BD parse(String pathXML){
    SAXParserFactory spf = SAXParserFactory.newInstance();
    try {
      SAXParser sp = spf.newSAXParser();
      sp.parse(pathXML, this);
    }catch(SAXException | ParserConfigurationException | IOException se) {
      return null;
    }
    return null;
  }
  
  @Override
  public void startElement(String uri, String localName, String qName,
    Attributes attributes) throws SAXException {
    if((!qName.equalsIgnoreCase("dblp")) && (!ignorar(qName))){
      if (tagPrincipal.isEmpty()){
        tagPrincipal = qName;
        //Comecando nova tag (artigo, tese, etc.)
        
        //ignorar "article","phdthesis"
        //if(!tagPrincipal.equals("article") && !tagPrincipal.equals("phdthesis")) {
        
      /*String chave = tagPrincipal;
        
      if(temp.get(chave) == null) temp.put(chave, 0);             
      temp.put(chave, Integer.valueOf(temp.get(chave)).intValue() + 1); */
        

            tab = funcoes.cria(tagPrincipal);
            
            if((tab != null) && (attributes != null)){
              for(int i=0;i<attributes.getLength();i++){
                String campo = attributes.getQName(i);
                String valor = attributes.getValue(i);
                
                if((!funcoes.isNullOrEmpty(campo)) && (!funcoes.isNullOrEmpty(valor))){
                  tab.preencheAttr(campo,valor);
                }  
              }
            }
        //} else {
        //    tab = null;
        //}
      }else{          
        tagSecundaria = qName;
        addTexto = true;
      }
   } else {
        //Se eh para ignorar, entao a tab precisa ser inicializada novamente com null
        tab = null;
    }
    
     
  }
  
  @Override
  public void endElement(String namespaceURI, String localName,
          String rawName) throws SAXException {
    if(!ignorar(rawName)){
      if(rawName.equalsIgnoreCase(tagPrincipal)){
        tagPrincipal = "";
        if (tab != null){
          if ((autorValido) | !(funcoes.temAutor(tab))){
             tab.insere(true);  
            autorValido = false;
          }
        }  
      }else{
        if (tab != null){
          if(rawName.equalsIgnoreCase("author") && (funcoes.pesqEstaNaLita(texto))){
            autorValido = true;
          };
          texto = texto.replaceAll("'", "");
          tab.preencheAttr(tagSecundaria, texto);
          tagSecundaria = "";
        }
        texto = "";
      };
    }  
  }
  
  @Override
  public void characters(char[] ch, int start, int length) throws SAXException {
    if (addTexto){
      texto += funcoes.removeAcentos(new String(ch, start, length));
      texto = texto.replaceAll("\n", "");
      
      //Fazer a carga apenas dos anos menores que 1990
      //Cargas jah realizadas:
      //Ateh 1989 ==> Executado
      //Igual a 1990 ==> Executado
      //Igual a 1991 e 1992 ==> Executado
      //Igual a 1993 e 1994 ==> Executado
      //Igual a 1995 e 1996 ==> Executado
      //Igual a 1997 e 1998 ==> Executado
      //Igual a 1999 e 2000 ==> Executado
      //Igual a 2001 e 2002 ==> Executado
      //Igual a 2003 ==> Executado
      //Igual a 2004 ==> Executado
      //Igual a 2005 ==> Executado
      //Igual a 2006 ==> Executado
      //Igual a 2007 ==> Executado
      //Igual a 2008 ==> Executado
      //Igual a 2009 ==> Executado
      //Igual a 2010 ==> Executado
      //Igual a 2011 ==> Executado
      //Igual a 2012 ==> Executado
      //Igual a 2013 ==> Executado
      //Igual a 2014 ==> Executado
      if(tagSecundaria.equals("year") && (Integer.valueOf(texto) != 1995 && Integer.valueOf(texto) != 1996 )) {
          tab = null;
          
          String chave = tagPrincipal + "_" + texto;

          if(temp.get(chave) == null) temp.put(chave, 0);             
          temp.put(chave, Integer.valueOf(temp.get(chave)).intValue() + 1);
      }
    }  
  }
  
  private boolean ignorar(String tag){
      
      if (IGNORETAGS.contains(tag)){
        return true;
      } else
        return false;
  }
  
}
